package com.bear.线性结构.后缀表达式;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * <简述> 后缀表达式（逆波兰表达式）
 * <详细描述>1、逆波兰表达式计算   2、中缀表达式转后缀表达式（逆波兰表达式）
 *
 * @author LiuShanshan
 * @version $Id$
 */
public class PolandNotation {
    public static void main(String[] args) {
        // (3+4)×5-6对应的后缀表达式就是3 4 + 5 × 6 -
        // 2.逆波兰表达式计算
        List<String> exp = new ArrayList<>();
        exp.add("3");
        exp.add("4");
        exp.add("+");
        exp.add("5");
        exp.add("*");
        exp.add("6");
        exp.add("-");
        System.out.printf("计算出来的值为：%s", calculate(exp));
        // 1.中缀表达式转后缀表达式

    }


    // 逆波兰表达式，计算出值
    public static int calculate(List<String> exp){
        Stack<Integer> integerStack = new Stack<>();
        if(exp.size() == 0){
            System.out.println("没有需要计算的数据");
        }
        // 加入栈，并且计算，计算逻辑为：压入数据，遇到运算符的时候，取出最上面的2个数据，进行计算，将计算出来的值放回栈，直到运算到
        // 栈中只剩下一个值为止
        for (String s : exp) {
            // 如果是数字，则直接放入栈
            if(s.matches("\\d+")){
                integerStack.push(Integer.valueOf(s));
            }else{
                // 如果是符号，则从栈中取出2个数据进行计算，然后再放回栈
                Integer pop2 = integerStack.pop();
                Integer pop1 = integerStack.pop();
                //判断当前是 + - * / 哪一个
                if("+".equals(s)){
                    integerStack.push(pop1 + pop2);
                }else if ("-".equals(s)){
                    integerStack.push(pop1 - pop2);
                }else if("*".equals(s)){
                    integerStack.push(pop1 * pop2);
                }else if("/".equals(s)){
                    integerStack.push(pop1/pop2);
                }
            }

        }
        return integerStack.pop();
    }

}

